package thread;

/**
 * 线程提供了一个方法:
 * void join()
 * 该方法可以协调线程之间的同步运行，该方法允许一个线程在另一个线程上等待，直到其执行完毕后
 * 才会解除等待(阻塞)继续后续的工作
 * 线程的同步执行:执行存在了先后顺序。
 *
 */
public class JoinDemo {
    private static boolean isFinish;//标识图片是否下载完毕的状态
    public static void main(String[] args) {
        Thread download = new Thread(){
            public void run(){
                System.out.println("down:开始下载图片...");
                for(int i=1;i<=100;i++){
                    System.out.println("down:"+i+"%");
                    try {
                        Thread.sleep(50);//阻塞
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("down:图片下载完毕!");
                isFinish = true;
            }
        };

        Thread show = new Thread(){
            public void run(){
                System.out.println("show:开始显示文字...");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                }
                System.out.println("show:文字显示完毕!");
                System.out.println("show:开始显示图片...");
                //阻塞show线程直到download线程执行完毕(图片下好了)
                System.out.println("show:等待download下载...");
                try {
                    download.join();//show线程调用该方法是进入阻塞，直到download结束方可解除阻塞
                } catch (InterruptedException e) {
                }
                System.out.println("show:等待download完毕!");
                if(!isFinish){//若图片没有下载完毕
                    throw new RuntimeException("图片加载失败!");
                }
                System.out.println("show:显示图片完毕!");
            }
        };

        download.start();
        show.start();

    }
}




